package cn.schoolwow.quickflow.service.flowContext.putInstanceData;

import cn.schoolwow.quickflow.QuickFlow;
import cn.schoolwow.quickflow.domain.FlowContext;
import cn.schoolwow.quickflow.domain.FlowDataFeature;
import cn.schoolwow.quickflow.dto.FlowContextDataRange;

public interface FlowContextPutInstanceDataOperation {
    /**
     * 设置线程本地实例数据
     */
    FlowContext putThreadLocalInstanceData(Object instance);

    /**
     * 设置线程本地实例数据
     */
    FlowContext putThreadLocalInstanceData(Object instance, Class classType);

    /**
     * 设置当前流程单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putCurrentFlowInstanceData(Object instance);

    /**
     * 设置当前流程单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putCurrentFlowInstanceData(Object instance, Class classType);

    /**
     * 设置当前复合流程单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putCurrentCompositeFlowInstanceData(Object instance);

    /**
     * 设置当前复合流程单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putCurrentCompositeFlowInstanceData(Object instance, Class classType);

    /**
     * 设置临时单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putTemporaryInstanceData(Object instance);

    /**
     * 设置临时单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putTemporaryInstanceData(Object instance, Class classType);

    /**
     * 设置单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putInstanceData(Object instance, FlowDataFeature... flowDataFeatures);

    /**
     * 设置单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putInstanceData(Object instance, Class classType, FlowDataFeature... flowDataFeatures);

    /**
     * 设置全局线程上下文实例参数
     */
    FlowContext putContextThreadLocalInstanceData(Object instance, FlowDataFeature... flowDataFeatures);

    /**
     * 设置全局线程上下文实例参数
     */
    FlowContext putContextThreadLocalInstanceData(Object instance, Class classType, FlowDataFeature... flowDataFeatures);

    /**
     * 设置全局上下文单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putContextInstanceData(Object instance);

    /**
     * 设置全局上下文单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putContextInstanceData(Object instance, Class classType);

    /**
     * 设置全局上下文临时单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putContextTemporaryInstanceData(Object instance);

    /**
     * 设置全局上下文临时单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putContextTemporaryInstanceData(Object instance, Class classType);

    /**
     * 设置单个实例对象
     * @param instance 上下文数据对象
     */
    FlowContext putInstanceData(Object instance, FlowContextDataRange flowContextDataRange, FlowDataFeature... flowDataFeatures);

    /**
     * 设置单个实例对象
     * @param instance 上下文数据对象
     * @param classType 指定实例类型
     */
    FlowContext putInstanceData(Object instance, Class classType, FlowContextDataRange flowContextDataRange, FlowDataFeature... flowDataFeatures);
}
